package com.pisolution.scheduler.core.utils;

import com.google.gson.Gson;

import java.lang.reflect.Type;
import java.nio.charset.StandardCharsets;

/**
 * 序列化与反序列化工具.
 *
 * @author sora
 * @version 0.1.0
 */
public final class JsonUtils {
    /** 序列化与反序列化工具. */
    private static final Gson GSON = new Gson();

    // -------------------------------------------------------------------------------------------------
    //  序列化
    // -------------------------------------------------------------------------------------------------

    /**
     * 将给定对象序列化成json格式并提取字节信息.
     *
     * @param obj 需要被序列化的对象.
     * @param <T> 被序列化的对象的类型.
     *
     * @return 序列化之后的字节信息.
     */
    public static <T> byte[] serialize(T obj) {
        return GSON.toJson(obj).getBytes(StandardCharsets.UTF_8);
    }

    /**
     * 将给定对象序列化成json字符串.
     *
     * @param obj 需要被序列化的对象.
     * @param <T> 被序列化的对象的类型.
     *
     * @return 序列化之后的json字符串.
     */
    public static <T> String serializeToString(T obj) {
        return GSON.toJson(obj);
    }

    // -------------------------------------------------------------------------------------------------
    //  反序列化
    // -------------------------------------------------------------------------------------------------

    /**
     * 将给定的字节数组反序列化成给定类型的对象.
     *
     * @param source 需要被反序列化的字节数组.
     * @param clazz 需要反序列化成的对象类型.
     * @param <T> 反序列成的对象类型.
     *
     * @return 反序列化得到的给定类型的对象.
     */
    public static <T> T deserialize(byte[] source, Class<T> clazz) {
        return GSON.fromJson(new String(source, StandardCharsets.UTF_8), clazz);
    }

    /**
     * 将给定的json字符串反序列化成给定类型的对象.
     *
     * @param source 需要被反序列化的json字符串.
     * @param type 需要反序列化成的对象类型.
     * @param <T> 反序列成的对象类型.
     *
     * @return 反序列化得到的给定类型的对象.
     */
    public static <T> T deserialize(String source, Type type) {
        return GSON.fromJson(source, type);
    }

    // -------------------------------------------------------------------------------------------------

    /** 阻止实例化. */
    private JsonUtils() {
    }
}
